﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SIGEB.Modelo;
using SIGEB.Prototipo.Control;
using SIGEB.Modelo.moduloDocumentos;
using SIGEB.Prototipo.control;

namespace SIGEB.Prototipo.Vista.moduloDocumentos
{
    public partial class busquedaDocumento : frm_Base
    {
      
        #region "constructores"

        public busquedaDocumento(objetoReturn retorno, controlPrincipal cp)
            : base(cp)
        {
            InitializeComponent();
            asignarUI(this.Controls);
            this.retorno = retorno;
            //this.datosActuales = datosActuales;
            //mostrarDocumentos(datosActuales);
            rbt_titulo.Checked = true;
            if (retorno == null)
            {
                throw new Exception("Necesita asignar un retorno");
            }
            this.retorno = retorno;
        }

        #endregion

        #region "eventos"

        private void rbt_nombre_CheckedChanged(object sender, EventArgs e)
        {
            limpiarCampos();
            actualizarCampos();
        }

        private void dgv_usuarios_SelectionChanged(object sender, EventArgs e)
        {
            actualizarActual();
        }

        private void dgv_usuarios_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            devolverSeleccionado();
        }

        private void rbt_titulo_CheckedChanged(object sender, EventArgs e)
        {
            limpiarCampos();
            actualizarCampos();
        }

        private void rbt_autor_CheckedChanged(object sender, EventArgs e)
        {
            limpiarCampos();
            actualizarCampos();
        }

        private void rbt_id_CheckedChanged(object sender, EventArgs e)
        {
            limpiarCampos();
            actualizarCampos();
        }

        private void rbt_libre_CheckedChanged(object sender, EventArgs e)
        {
            limpiarCampos();
            actualizarCampos();
            //if (rbt_libre.Checked) btn_buscar.Enabled = true;
            //else btn_buscar.Enabled = false;
        }

        private void txt_id_TextChanged(object sender, EventArgs e)
        {/*
            if (rbt_id.Checked && Validacion.LongitudCadenaValida(txt_id.Text, true, 20))
            {
                mostrarDocumentos(buscarCodigo(datosActuales, txt_id.Text));
            }
            else
            {
                //mostrarDocumentos(datosActuales);
                dgv_doc.DataSource = null;
            }*/
        }

        private void txt_titulo_TextChanged(object sender, EventArgs e)
        {
            /*
            if (rbt_titulo.Checked && Validacion.LongitudCadenaValida(txt_titulo.Text, true, 150))
            {
                mostrarDocumentos(buscarTitulo(datosActuales, txt_titulo.Text));
            }
            else
            {
                //mostrarDocumentos(datosActuales);
                dgv_doc.DataSource = null;
            }
            */
        }

        private void txt_autor_TextChanged(object sender, EventArgs e)
        {
            /*
            if (rbt_autor.Checked && Validacion.LongitudCadenaValida(txt_autor.Text, true, 100))
            {
                mostrarDocumentos(buscarAutor(datosActuales, txt_autor.Text));
            }
            else
            {
                //mostrarDocumentos(datosActuales);
                dgv_doc.DataSource = null;
            }*/
        }

        private void btn_buscar_Click(object sender, EventArgs e)
        {
            if (rbt_libre.Checked && txt_libre.Text != "")
            {
                mostrarDocumentos(buscarLibre(txt_libre.Text));
            }
            else if (rbt_autor.Checked && Validacion.LongitudCadenaValida(txt_autor.Text, true, 100))
            {
                mostrarDocumentos(buscarAutor(txt_autor.Text));
            }
            else if (rbt_id.Checked && Validacion.LongitudCadenaValida(txt_id.Text, true, 20))
            {
                mostrarDocumentos(buscarCodigo(txt_id.Text));
            }
            else if (rbt_titulo.Checked && Validacion.LongitudCadenaValida(txt_titulo.Text, true, 150))
            {
                mostrarDocumentos(buscarTitulo(txt_titulo.Text));
            }
            else
            {
                //mostrarDocumentos(datosActuales);
                dgv_doc.DataSource = null;
            }
        }

        private void dgv_doc_SelectionChanged(object sender, EventArgs e)
        {
            actual = capturaSeleccion();
        }

        private void btn_seleccionar_Click_1(object sender, EventArgs e)
        {
            devolverSeleccionado();
        }

        private void btn_cancelar_Click_1(object sender, EventArgs e)
        {
            this.Close();
        }

        private void dgv_doc_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            devolverSeleccionado();
        }

        #endregion

        #region "metodos"

        private void limpiarCampos()
        {
            txt_autor.Text = txt_libre.Text = txt_id.Text = txt_titulo.Text = "";
        }

        private void actualizarCampos()
        {
            txt_libre.Enabled = rbt_libre.Checked;
            txt_titulo.Enabled = rbt_titulo.Checked;
            txt_autor.Enabled = rbt_autor.Checked;
            txt_id.Enabled = rbt_id.Checked;
        }

        private void mostrarDocumentos(LinkedList<documento> documentos)
        {
            llenarColumnas();
            if (documentos != null)
            {
                foreach (documento actual in documentos)
                {
                    dgv_doc.Rows.Add(actual.codDocumento, actual.titulo, actual.autorD.nombre, actual.editorialD.nombre);
                }
            }
            if (documentos.Count == 0)
            {
                mostrarInfo("El criterio de búsqueda ingresado no generó ningún resultado.");
            }
        }

        private void llenarColumnas()
        {
            dgv_doc.Columns.Clear();
            dgv_doc.Columns.Add("Codigo", "Codigo");
            dgv_doc.Columns.Add("Titulo", "Título");
            dgv_doc.Columns.Add("Autor", "Autor");
            dgv_doc.Columns.Add("Editorial", "Editorial");
        }

        private void actualizarActual()
        {
            actual = cd.documentoCodigo(getFromDgv());
        }

        private string getFromDgv()
        {
            try
            {
                dgv_doc.Rows[dgv_doc.SelectedCells[0].RowIndex].Selected = true;
                String code = dgv_doc.SelectedRows[0].Cells[0].Value.ToString();
                return code;
            }
            catch
            {
                return null;
            }
        }

        private documento capturaSeleccion()
        {
            documento nuevo = null;
            try
            {
                dgv_doc.Rows[dgv_doc.SelectedCells[0].RowIndex].Selected = true;
                String codigo = dgv_doc.SelectedRows[0].Cells[0].Value.ToString();
                if (codigo != null)
                {
                    nuevo = getDocumento(codigo);
                }
            }
            catch
            {

            }
            return nuevo;
        }

        private documento getDocumento(string codigo)
        {
            try
            {
                actual = cp.ctrlDocumentos.documentoCodigo(codigo);
                return actual;
            }
            catch (Exception ex)
            {
                ventanaError(ex.Message);
            }
            return null;

        }

        private void devolverSeleccionado()
        {
            if (actual != null)
            {
                retorno.objeto = actual.codDocumento;
                this.Close();
            }
            else
            {
                MessageBox.Show("Debe escoger un documento");
            }
        }

        private LinkedList<documento> buscarLibre(string texto)
        {
            LinkedList<documento> lista = new LinkedList<documento>();
            try
            {
                lista = cp.ctrlDocumentos.documentoLibre(texto);
            }
            catch (Exception ex)
            {
                ventanaError(ex.Message);
            }
            return lista;
        }

        private LinkedList<documento> buscarCodigo(string codigo)
        {
            LinkedList<documento> lista = new LinkedList<documento>();
            try
            {
                documento d = cp.ctrlDocumentos.documentoCodigoConsulta(codigo);
                if (d != null) lista.AddLast(d);
            }
            catch (Exception ex)
            {
                ventanaError(ex.Message);
            }
            return lista;
        }

        private LinkedList<documento> buscarTitulo(string titulo)
        {
            LinkedList<documento> lista = new LinkedList<documento>();
            try
            {
                lista = cp.ctrlDocumentos.documentoTitulo(titulo);
            }
            catch (Exception ex)
            {
                ventanaError(ex.Message);
            }
            return lista;
        }

        private LinkedList<documento> buscarAutor(string autor)
        {
            LinkedList<documento> lista = new LinkedList<documento>();
            try
            {
                lista = cp.ctrlDocumentos.documentoAutor(autor);
            }
            catch (Exception ex)
            {
                ventanaError(ex.Message);
            }
            return lista;
        }

        #endregion

        #region "metodos botones"

        private void btn_seleccionar_Click(object sender, EventArgs e)
        {
            devolverSeleccionado();
        }

        private void btn_cancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }


        #endregion

        #region "atributos"

        objetoReturn retorno;

        controlDocumentos cd;
        documento actual;
        LinkedList<documento> datosActuales;
        private LinkedList<documento> datosDocumentos;


        #endregion

        private void txt_libre_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) btn_buscar_Click(sender, e);
        }

        private void txt_id_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) btn_buscar_Click(sender, e);
        }

        private void txt_autor_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) btn_buscar_Click(sender, e);
        }

        private void txt_titulo_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) btn_buscar_Click(sender, e);
        }

    }
}
